package org.dromara.hm.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.hm.domain.HmTodoItems;
import org.dromara.hm.domain.vo.HmTodoItemsVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;

import java.util.Date;
import java.util.List;

/**
 * 代办事项Mapper接口
 *
 * @author zy Hu
 * @date 2024-12-15
 */
public interface HmTodoItemsMapper extends BaseMapperPlus<HmTodoItems, HmTodoItemsVo> {

    @Override
    @DataPermission({
        @DataColumn(key = "deptName", value = "todo_stock_dept"),
        @DataColumn(key = "userName", value = "todo_person_id")
    })
    default <P extends IPage<HmTodoItemsVo>> P selectVoPage(IPage<HmTodoItems> page, Wrapper<HmTodoItems> wrapper)
    {
        return BaseMapperPlus.super.selectVoPage(page, wrapper);
    }

    void updateTodoItems(
        @Param("oldStaffId") Long oldStaffId,
        @Param("newStaffId") Long effectiveNewStaffId,
        @Param("newStaffName") String effectiveNewStaffName,
        @Param("operatorUsername") String operatorUsername,
        @Param("updateTime") Date now
    );

    // Default method to find todos to be transferred
    default List<HmTodoItems> selectPendingTodosByStaffId(Long staffId) {
        return this.selectList(new LambdaQueryWrapper<HmTodoItems>()
            .eq(HmTodoItems::getTodoPersonId, staffId)
            .eq(HmTodoItems::getStatus, "0") // "0" is pending
        );
    }

    /**
     * 根据客户ID列表批量更新待办事项的归属。
     * @param customerIds 客户ID列表
     * @param newStaffId 新员工ID
     * @param newStaffName 新员工姓名
     * @param operatorUsername 操作人用户名
     * @param updateTime 当前时间
     * @return 更新的行数
     */
    int updateTodoItemsByCustomerIds(
        @Param("customerIds") List<Long> customerIds,
        @Param("newStaffId") Long newStaffId,
        @Param("newStaffName") String newStaffName,
        @Param("operatorUsername") String operatorUsername,
        @Param("updateTime") Date updateTime
    );

    /**
     * 查询指定客户ID列表下所有未完成的待办事项。
     * @param customerIds 客户ID列表
     * @return 待办事项列表
     */
    default List<HmTodoItems> selectPendingTodosByCustomerIds(List<Long> customerIds) {
        return this.selectList(new LambdaQueryWrapper<HmTodoItems>()
            .in(HmTodoItems::getFollowCustomerId, customerIds)
            .eq(HmTodoItems::getStatus, "0") // "0" is pending/未完成
            .eq(HmTodoItems::getDelFlag, false) // 未删除
        );
    }


}
